/**
 * 加密工具 - 兼容 uniapp
 * 使用 crypto-js 进行 AES 加密
 * 
 * 依赖：npm install crypto-js --legacy-peer-deps
 */

// 统一使用 import，让 uniapp 自动处理 npm 包
// uniapp 会在构建时自动将 npm 包处理为小程序可用的格式
import CryptoJSModule from 'crypto-js'

// 处理不同环境下的导出格式
let CryptoJS = CryptoJSModule

// 如果是 ES6 模块，可能需要提取 default
if (CryptoJSModule && typeof CryptoJSModule === 'object') {
  if (CryptoJSModule.default) {
    CryptoJS = CryptoJSModule.default
  } else if (CryptoJSModule.CryptoJS) {
    CryptoJS = CryptoJSModule.CryptoJS
  }
}

// 调试信息：检查 CryptoJS 的加载情况
console.log('🔍 CryptoJS 模块检查:', {
  hasCryptoJSModule: !!CryptoJSModule,
  hasCryptoJS: !!CryptoJS,
  hasAES: !!(CryptoJS && CryptoJS.AES),
  hasEnc: !!(CryptoJS && CryptoJS.enc),
  hasMode: !!(CryptoJS && CryptoJS.mode),
  cryptoJSType: typeof CryptoJS,
  cryptoJSModuleType: typeof CryptoJSModule
})

// 验证 CryptoJS 是否加载成功
if (!CryptoJS || !CryptoJS.AES || !CryptoJS.enc || !CryptoJS.mode) {
  console.error('❌ CryptoJS 加载失败！')
  console.error('CryptoJSModule:', CryptoJSModule)
  console.error('CryptoJS:', CryptoJS)
  console.error('请确保已安装: npm install crypto-js --legacy-peer-deps')
  throw new Error('CryptoJS 未正确加载，请检查 crypto-js 是否已安装')
}

console.log('✅ CryptoJS 加载成功，版本信息:', CryptoJS.version || '未知')

/**
 * AES 加密函数 (CBC 模式, ZeroPadding)
 * @param {string} message - 要加密的消息
 * @param {string} key - 加密密钥
 * @param {string} iv - 初始化向量
 * @returns {string} Base64 编码的加密结果
 */
export const encryptByDESModeCBCUtf8to64 = (message, key, iv) => {
  // 参数验证
  if (!message) {
    console.error('❌ 加密失败: message 参数为空')
    throw new Error('加密消息不能为空')
  }
  if (!key) {
    console.error('❌ 加密失败: key 参数为空')
    throw new Error('加密密钥不能为空')
  }
  if (!iv) {
    console.error('❌ 加密失败: iv 参数为空')
    throw new Error('初始化向量不能为空')
  }
  
  // 检查 CryptoJS 是否可用
  if (!CryptoJS || !CryptoJS.AES || !CryptoJS.enc || !CryptoJS.mode) {
    console.error('❌ 加密失败: CryptoJS 未正确加载')
    throw new Error('CryptoJS 未正确加载，无法执行加密')
  }
  
  try {
    console.log('🔐 开始加密:', { message, keyLength: key.length, ivLength: iv.length })
    
    const keyHex = CryptoJS.enc.Utf8.parse(key)
    const ivHex = CryptoJS.enc.Utf8.parse(iv)
    const newparams = CryptoJS.enc.Utf8.parse(message)
    
    const encrypted = CryptoJS.AES.encrypt(newparams, keyHex, {
      iv: ivHex,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.ZeroPadding
    })
    
    const result = encrypted.ciphertext.toString(CryptoJS.enc.Base64)
    
    console.log('✅ 加密成功:', { 
      original: message, 
      encrypted: result,
      resultLength: result.length 
    })
    
    if (!result || result.length === 0) {
      console.error('❌ 加密结果为空！')
      throw new Error('加密结果为空')
    }
    
    return result
  } catch (error) {
    console.error('❌ 加密失败:', error)
    console.error('错误详情:', {
      message: error.message,
      stack: error.stack,
      cryptoJS: !!CryptoJS,
      hasAES: !!(CryptoJS && CryptoJS.AES),
      hasEnc: !!(CryptoJS && CryptoJS.enc)
    })
    throw error
  }
}

// 导出 CryptoJS 供其他模块使用（如果需要直接使用 CryptoJS）
export { CryptoJS }

